package com.atguigu.lease.common.redis;

import java.time.Duration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @Author GQS @Date 2024/9/2/20:52 @Description
 */
@Configuration
@EnableCaching // 开启缓存注解
public class RedisConfiguration {
  // springboot整合了redis启动器，启动时会初始化redisTemplate对象，
  // 在初始化它之前会先创建RedisConnectionFactory连接工厂
  @Bean
  /**
   * 配置并返回一个缓存管理器，该管理器使用Redis作为缓存存储.
   * 该方法通过接受一个Redis连接工厂来建立缓存管理器，并且定义了缓存的默认配置，
   * 包括缓存的过期时间、键和值的序列化方式等.
   *
   * @param factory Redis连接工厂，用于建立与Redis服务器的连接.
   * @return 返回配置好的Redis缓存管理器.
   */
  public CacheManager cacheManager(RedisConnectionFactory factory) {
      // Redis缓存配置
      RedisCacheConfiguration config =
          RedisCacheConfiguration.defaultCacheConfig() // 使用默认配置
              .entryTtl(Duration.ofSeconds(3000L)) // 自动缓存的过期时间，设置为3000秒
              .serializeKeysWith(
                  RedisSerializationContext.SerializationPair.fromSerializer(
                      new StringRedisSerializer())) // 键的序列化器，使用StringRedisSerializer
              .serializeValuesWith(
                  RedisSerializationContext.SerializationPair // 值的序列化器
                      .fromSerializer(new GenericJackson2JsonRedisSerializer()));
      //                .disableCachingNullValues() 禁用缓存空数据值，此处未启用
      // 创建缓存管理器对象：
      return RedisCacheManager.builder(factory).cacheDefaults(config).build();
  }
  }

